/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utilidades;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Vector;
import javax.swing.JFileChooser;
//Modificacion: grupo 1=>idioma cuadro abrir,extension
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
//
import javax.swing.JOptionPane;
import vistas.VistaPrincipal;

/**
 *
 * @author Bassist-s1
 */
public class LeerArchivo {

        private String ruta = "usuario.txt";
	private Vector usuarios = new Vector ();
	private int numeroUsuarios;


	public String getRuta () {
		return ruta;
	}

	public void setRuta (String ruta) {
		this.ruta = ruta;
	}

	public int getNumeroUsuarios () {
		return numeroUsuarios;
	}

	public void setNumeroUsuarios (int num_usuarios) {
		this.numeroUsuarios = num_usuarios;
	}

	public Vector getUsuario () {
		return usuarios;
	}

	public void setUsuario (Vector usuarios) {
		this.usuarios = usuarios;
	}

        //método el cual carga los datos del archivo respaldado por el usuario
        //va llenando las vistas según los datos leidos
        public boolean abrir_archivo (String usuarioActual, VistaPrincipal vista) throws FileNotFoundException, IOException
        {                
                JFileChooser fileChooser = new JFileChooser();
                //Creando filtro=>filtrar extension txt
		FileFilter filter = new FileNameExtensionFilter(".txt", "txt");
                fileChooser.addChoosableFileFilter(filter);
                // Editando labels en Inglés
                UIManager.put("FileChooser.lookInLabelText", "Buscar en");
		UIManager.put("FileChooser.saveInLabelText", "Guardat en");
                UIManager.put("FileChooser.cancelButtonText", "Cancelar");
                UIManager.put("FileChooser.openButtonText", "Abrir");
                UIManager.put("FileChooser.fileNameLabelText", "Nombre del Archivo");
                //UIManager.put ("FileChooser.filesOfTypeLabelText", new Integer ('N'));
                UIManager.put("FileChooser.filesOfTypeLabelText", "Archivos de Tipo");
                UIManager.put("FileChooser.openButtonToolTipText", "Abrir Archivo Seleccionado");
                UIManager.put("FileChooser.cancelButtonToolTipText","Cancelar");
                UIManager.put("FileChooser.fileNameHeaderText","Nombre del Archivo");
                UIManager.put("FileChooser.upFolderToolTipText", "Subir");
                UIManager.put("FileChooser.homeFolderToolTipText","Escritorio");
                UIManager.put("FileChooser.newFolderToolTipText","Crear nueva Carpeta");
                UIManager.put("FileChooser.listViewButtonToolTipText","Ver Lista");
                UIManager.put("FileChooser.newFolderButtonText","Crear nueva Carpeta");
                UIManager.put("FileChooser.renameFileButtonText", "Renombrar archivo");
                UIManager.put("FileChooser.deleteFileButtonText", "Eliminar achivo");
                UIManager.put("FileChooser.filterLabelText", "Archivos de Tipo");
                UIManager.put("FileChooser.detailsViewButtonToolTipText", "Ver Detalles");
                UIManager.put("FileChooser.fileSizeHeaderText","Tamaño");
                UIManager.put("FileChooser.fileDateHeaderText", "Fecha de modificación");
                // Guardar edición realizada
                SwingUtilities.updateComponentTreeUI(fileChooser);
		//Aplicando filtro
                fileChooser.setFileFilter(filter);
                fileChooser.setAcceptAllFileFilterUsed(false);
                //
                int seleccion = fileChooser.showOpenDialog(vista);
                if (seleccion == JFileChooser.APPROVE_OPTION)
                {
                    File fichero = fileChooser.getSelectedFile();

                    /*
                     * GRUPO4 Prevención de errores 4 --> nombre de archivo inexistente, y archivo inválido
                     */
                    if(!fichero.exists())
                    {
                        JOptionPane.showMessageDialog(null, "No existe el archivo '"+ fichero.getName()+"'","REUSA",0);
                        return false;
                    }

                    if(!fichero.canRead())
                    {
                        JOptionPane.showMessageDialog(null, "Archivo '"+fichero.getName()+"' inválido","REUSA",0);
                        return false;
                    }
                    vista.nombreArchivo= fichero.getName();
                    // Fin GRUPO4

                    LeerArchivo leer_archivo = new LeerArchivo();
                    leer_archivo.setRuta(fichero.getPath());
                    String aux = new String ();
                    BufferedReader br=null;
                    br = new BufferedReader(new FileReader(fichero.getPath()));                    

                    if(!validarFormato(br))
                    {
                        JOptionPane.showMessageDialog(null,"Formato de archivo no válido.\n El archivo que intenta abrir tiene un formato no reconocido por la aplicación","REUSA",JOptionPane.ERROR_MESSAGE);
                        return false;
                    }

                    br = new BufferedReader(new FileReader(fichero.getPath()));

                    aux= br.readLine();

                    if(!aux.equals(usuarioActual))
                        JOptionPane.showMessageDialog(null,"Usted no tiene permisos para abrir este archivo","REUSA",JOptionPane.ERROR_MESSAGE);
                    else
                    {
                        String corte[];
                        aux = br.readLine();
                        vista.cargarTamañoSoftware(aux);

                        aux = br.readLine();
			corte = aux.split ("#");
                        vista.cargarNumeroModulos(corte[0], corte[1]);

                        aux = br.readLine();
                        System.out.println(aux);
                        corte = aux.split("#");
                        vista.cargarUsuariosEvaluadores(corte[0], corte[1], corte[2], corte[3]);

                        aux = br.readLine();
                        vista.cargarLugarEvaluacion(aux);

                        aux = br.readLine();
                        corte = aux.split("#");
                        vista.cargarTiempoEmplear(corte[0], corte[1], corte[2]);
                        
                        aux = br.readLine();
                        corte = aux.split("#");
                        vista.cargarPeriodoEntrega(corte[0], corte[1], corte[2], corte[3]);

                        aux = br.readLine();
                        vista.cargarUF(aux);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosArriendo(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosOperacionales(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosMaterialApoyo(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosInsumos(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosBasicos(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosMovilizacion(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosCoffeBreaks(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosAlimentacion(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosServicios(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarGastosTotal(corte[0], corte[1]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarPaso2Reparacion(corte[0],corte[1],corte[2],corte[3]);

                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarPaso2Final(corte[0],corte[1],corte[2]);
                        //se carga la vista panelPaso3
                        aux = br.readLine();
                        corte = aux.split ("#");
                        vista.cargarPaso3(corte[0],corte[1],corte[2],corte[3],corte[4],corte[5],corte[6],corte[7],corte[8]);
                    }
                    vista.progresoActual= false;
                    vista.progresoAnterior= false;
                }
                return true;
        }
             
        // GRUPO4 Prevención de errores: Métodos para validar formato de archivo REUSA
        public float convertibleFloat(String s)
        {
            float valor;

            try
            {
                valor= Float.parseFloat(s);
            }
            catch(Exception e)
            {
                return -2;
            }
            return valor;
        }

        public boolean validarFormato(BufferedReader br)
        {
            String linea;
            String campos[];
            float valor;

            try
            {
            // PESTAÑA1

                // Leyendo usuario --> no existen restricciones de formato
                linea = br.readLine();
                System.out.println(linea);

                // Leyendo opción tam software --> Debe ser int perteneciente a [1,3]
                linea = br.readLine();
                System.out.println(linea);
                valor= convertibleFloat(linea);

                if(valor<1 || valor>3 || valor==-2)
                    return false;                

                  // Leyendo número de múdulos [pequeños,medianos] --> número de campos debe ser igual a 2,
                  //  y cada campo debe ser mayor o igual a 0

                  linea = br.readLine();
                  campos= linea.split("#");

                  if(campos.length!=2)
                      return false;

                  for(int i=0;i<campos.length;++i)
                  {
                      valor= convertibleFloat(campos[i]);

                      if(valor<-1)
                          return false;
                  }                  
                
                // Leyendo cantidades de los distintos tipos de usuarios evaluadores y su total --> Número
                // de campos debe ser igual a 4 y cada campo debe ser mayor o igual 0

                linea = br.readLine();
                campos= linea.split("#");
                System.out.println(linea);                

                if(campos.length<4)
                      return false;                

                for(int i=0;i<campos.length;++i)
                {
                  valor= convertibleFloat(campos[i]);

                  if(valor<-1)
                      return false;
                }                

                // Leyendo lugar de evaluación --> Debe ser int perteneciente a [0,1]

                linea = br.readLine();
                valor= convertibleFloat(linea);

                if(valor<-1 || valor>1)
                    return false;                

                //Leyendo tiempos a emplear --> número de campos debe ser igual a 3, y cada campo debe ser mayor o igual a 0

                linea = br.readLine();
                campos = linea.split ("#");

                if(campos.length!=3)
                      return false;                

                for(int i=0;i<campos.length;++i)
                {
                  valor= convertibleFloat(campos[i]);

                  if(valor<-1)
                      return false;
                }                                

                //Leyendo modalidad período de entrega --> número de campos debe ser igual a 4, y cada campo debe ser mayor
                // o igual a 0, aunque puede ser -1 tambien

                linea = br.readLine();
                campos = linea.split ("#");

                if(campos.length!=4)
                      return false;                

                for(int i=0;i<campos.length;++i)
                {
                  valor= convertibleFloat(campos[i]);

                  if(valor<-1)
                      return false;
                }                

                // PESTAÑA2
                //Leyendo valor UF

                linea = br.readLine();

                valor= convertibleFloat(linea);

                if(valor<-1)
                    return false;                
                
                // Leyendo valores en pesos y en UF --> el número de campos debe ser igual a 2, y deben ser valores
                // enteros o convertibles a entero

                for(int i=0;i<10;++i)
                {
                    linea = br.readLine();
                    campos = linea.split ("#");

                    if(campos.length!=2)
                      return false;
                    
                    for(int j=0;j<campos.length;++j)
                    {
                        valor= convertibleFloat(campos[j]);

                        if(valor<-1)
                            return false;
                    }
                }
                
                //Leyendo siguiente línea --> valores deben ser enteros o convertibles a enteero y numero de campos igual a 4

                linea = br.readLine();
                campos = linea.split ("#");

                if(campos.length!=4)
                    return false;                

                for(int i=0;i<campos.length;++i)
                {
                    valor= convertibleFloat(campos[i]);

                    if(valor<-1 || valor==-2)
                    return false;
                }

                //Leyendo siguiente línea --> valores deben ser enteros o convertibles a enteero y numero de campos igual a 4

                linea = br.readLine();
                campos = linea.split ("#");

                if(campos.length!=3)
                    return false;
                
                for(int i=0;i<campos.length;++i)
                {
                    valor= convertibleFloat(campos[i]);

                    if(valor<-1 || valor==-2)
                    return false;
                }                

                // PESTAÑA3
                //Leyendo siguiente línea --> valores deben ser enteros o convertibles a enteero y numero de campos igual a 9

                linea = br.readLine();
                campos = linea.split ("#");

                if(campos.length!=9)
                    return false;                

                for(int i=0;i<campos.length;++i)
                {
                    valor= convertibleFloat(campos[i]);

                    if(valor<-1)
                        return false;
                }                
            }
            catch(Exception e)
            {
                return false;
            }
            return true;
        }
        // Fin GRUPO4

	public boolean buscar (String nombre, String contraseña) throws Exception {
		String archivo = "usuario.txt";
		String aux = new String ();
		boolean retorno = false;
		int contador = 0;
		BufferedReader br = new BufferedReader (new FileReader (archivo));
		while ((aux = br.readLine ()) != null) {
			contador++;
			String corte[];
			corte = aux.split ("#");
			if (corte[0].equals (nombre) && corte[1].equals (contraseña)) {
				retorno = true;
			}
		}
		numeroUsuarios = contador;
		return retorno;
	}

	public String cargarDatos (String name) throws Exception {
		String archivo = "usuario.txt";
		String aux = new String ();
		String linea = null;
		int contador = 0;
			BufferedReader br = new BufferedReader (new FileReader (archivo));
			while ((aux = br.readLine ()) != null) {
				contador++;
				String corte[];
				corte = aux.split ("#");
				if (corte[0].equals (name)) {
					linea = aux;
				}
			}
			numeroUsuarios = contador;
			return linea;
	}

	public String guardarDatos (String Name, String nombre, String clave, String mail, String fono, String movil) throws FileNotFoundException, IOException {
		String archivo = "usuario.txt";
		String aux = new String ();
		String linea = new String ();
		linea = "error";
		int cont = 0;
		try {
			BufferedReader in = new BufferedReader (new FileReader (archivo));
			while (true) {
				aux = in.readLine ();
				if (aux == null) {
					break;
				}
				else {
					cont++;
					String corte[];
					corte = aux.split ("#");
					if (!corte[0].equals (Name)) {
						Usuario user = new Usuario (corte[0], corte[1], corte[2], corte[3], corte[4]);
						usuarios.add (user);
					}
					//System.out.println (corte[0]);
				}
			}
			Usuario user = new Usuario (nombre, clave, mail, fono, movil);
			usuarios.add (user);
			in.close ();
			File fichero = new File ("usuario.txt");
			fichero.delete ();

			FileWriter fichero2 = null;
			PrintWriter pw = null;
			fichero2 = new FileWriter ("usuario.txt");
			pw = new PrintWriter (fichero2);


			for (int i = 0; i < usuarios.size (); i++) {
				Usuario ayuda = new Usuario ();
				ayuda = (Usuario) usuarios.get (i);
				nombre = ayuda.getNombre ();
				clave = ayuda.getClave ();
				mail = ayuda.getMail ();
				fono = ayuda.getFono ();
				movil = ayuda.getMovil ();
				pw.println (nombre + "#" + clave + "#" + mail + "#" + fono + "#" + movil);
			}

			pw.close ();

			return linea;
		}
		catch (Exception e) {
			System.out.println ("Error");
		}
		return linea;
	}

}
